package com.pedro.concurrency.singleton;

import com.pedro.concurrency.annoations.ThreadSafe;

/**
 * 懒汉模式 -》 双重同步锁
 * 单例模式在第一次使用时进行创建
 */
@ThreadSafe
public class SingletonExample5 {

    // 私有构造函数
    private SingletonExample5() {

    }

    // 1.memory = allocate() 分配类型的内存空间
    // 2.ctorInstance() 初始化对象
    // 3.instance = memory() 设置Instance指向刚分配的内存

    // 单例对象 volatile + 双重检测机制 -》 禁止指令重排
    private volatile static SingletonExample5 instance = null;

    // 静态的工厂方法
    public static SingletonExample5 getInstance() {
        if (instance == null) { // 双重检测机制 和 锁
            synchronized (SingletonExample5.class) {
                if (instance == null) {
                    instance = new SingletonExample5();
                }
            }
        }
        return instance;
    }
}
